May 02, 2022
이펙티브 타입스크립트 아이템 18 부분을 읽으면서 정리한 내용입니다.
불필요한 렌더링을 막기 위해 필요할 때만 차트를 다시 그릴 것이다. 아래 props중 onClick 이벤트를 제외하고만 다시 그리면 된다.
interface ScatterProps {
xs: number[];
ys: number[];
xRange: [number, number];
yRange: [number, number];
color: string;
// Events
onClick: (x: number, y: number, index: number) => void;
}
최적화를 두가지 방법으로 구현해 보겠다. (두가지 방법 모두 이상적이지 않은 방법이다)
function shouldUpdate(oldProps: ScatterProps, newProps: ScatterProps) {
let k: keyof ScatterProps;
for (k in oldProps) {
if (oldProps[k] !== newProps[k]) {
if (k !== 'onClick') return true;
}
}
return false;
}
false
기 때문에 재렌더는 일어나지 않는다. 그러나 이 역시 좋은 방법은 아닌데 그 이유는 zs나 zRagne 가 추가될 때마다 누락하지 않고 입력해줘야 하는데 놓칠 수도 있기 때문이다.function shouldUpdate(oldProps: ScatterProps, newProps: ScatterProps) {
return (
oldProps.xs !== newProps.xs ||
oldProps.ys !== newProps.ys ||
oldProps.xRange !== newProps.xRange ||
oldProps.yRange !== newProps.yRange ||
oldProps.color !== newProps.color
// (no check for onClick)
);
}
새로운 속성이 추가될 때마다 사용자가 직접 shouldUpdate를 고치도록 하는게 좋다.
바로바로 매핑된 타입과 객체를 사용하는 것이다.
const REQUIRES_UPDATE: { [k in keyof ScatterProps]: boolean } = {
// 여기 scatterProps
xs: true,
ys: true,
xRange: true,
yRange: true,
color: true,
onClick: false,
};
function shouldUpdate(oldProps: ScatterProps, newProps: ScatterProps) {
// 여기 scatterProps
let k: keyof ScatterProps;
for (k in oldProps) {
if (oldProps[k] !== newProps[k] && REQUIRES_UPDATE[k]) {
return true;
}
}
return false;
}